package com.atguigu.boot_redis03.controller;

import com.atguigu.boot_redis03.Service.CategoryService;
import com.atguigu.boot_redis03.entity.CategoryEntity;
import com.atguigu.boot_redis03.vo.Catelog2Vo;
import com.atguigu.common.utils.PageUtils;
import com.atguigu.common.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Map;


/**
 * @需求描述: 系统管理员-商品组 模块 分类数据 请求接口 控制器
 * @创建人: 郭承乾
 * @创建时间: 2020/12/18 17:36
 * @修改需求:
 * @修改人:
 * @修改时间:
 * @需求思路: 1、查询出所有三级分类并以树状形式显示
 */

@RestController
public class CategoryController {
    @Autowired
    private CategoryService categoryService;

    /**
     * http://localhost:10002/index/catalog.json            缓存分类数据---使用SpringCache
     * http://localhost:10002/index/catelog/redis           缓存分类数据---使用redis
     * http://localhost:10002/index/catelog/redissonLock    缓存分类数据---使用redisson作为分布式锁
     * http://localhost:10002/index/catelog/redisLock       缓存分类数据---使用redis编写实现分布式锁
     */

    /**
     *  查询出全部分类以树状显示
     * @return
     */
    @RequestMapping("/list/tree")
    public R list() {
        List<CategoryEntity> list = categoryService.listWithTree();
        return R.ok().put("data", list);
    }

    /**
     * 查询出一级分类
     * @return
     */
    @GetMapping({"/","index.html"})
    public List<CategoryEntity> indexPage() {
        // 1、查询出一级分类
        List<CategoryEntity> categoryEntityList = categoryService.getLevelCategorys();
        return categoryEntityList;
    }

    /**
     * 查询出全部分类-使用SpringCache
     * @return
     */
    @GetMapping("/index/catalog.json")
    public Map<String,List<Catelog2Vo>> getCatelogJson() {
        Map<String,List<Catelog2Vo>> map = categoryService.getCatelogJson();
        return map;
    }

    /**
     * 使用redis作为缓存
     * @return
     */
    @GetMapping("/index/catelog/redis")
    public Map<String,List<Catelog2Vo>> getCatelogJsonWithRedis() {
        Map<String,List<Catelog2Vo>> map = categoryService.getCatelogJsonAndRedis();
        return map;
    }

    /**
     * 使用redis作为缓存，并加入分布式锁(redisson)
     * @return
     */
    @GetMapping("/index/catelog/redissonLock")
    public Map<String,List<Catelog2Vo>> getCatelogJsonWithRedisson() {
        Map<String,List<Catelog2Vo>> map = categoryService.getCatelogJsonAndRedissson();
        return map;
    }

    /**
     * 使用redis作为缓存，并加入分布式锁,由redis实现
     * @return
     */
    @GetMapping("/index/catelog/redisLock")
    public Map<String,List<Catelog2Vo>> getCatelogJsonWithRedisLock() {
        Map<String,List<Catelog2Vo>> map = categoryService.getCatelogJsonAndRedisLock();
        return map;
    }
}
